package br.ufc.es.pds.mudproject.core;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

public class Ambiente {

	private String nome;
	private String descricao;
	private List<Objeto> objetos;
	private List<Npc> npcs;
	
	private Map<String,Ambiente> saidas;
	
	public Ambiente (String nome, String descricao) {
		this.nome = nome;
		this.descricao = descricao;
		
		objetos = new ArrayList<Objeto>();
		npcs = new ArrayList<Npc>();
		saidas = new HashMap<String, Ambiente>();
	}
	
	public void setNome( String nome ){
		this.nome = nome;
	}
	public String pegarNome(){
		return nome;
	}
	
	public void setDescricao(String descricao){
		this.descricao = descricao;
	}
	public String pegarDescricao(){
		return descricao;
	}
	
	public void adicionarSaida( String saida, Ambiente ambienteSaida){
		saidas.put(saida, ambienteSaida);
	}
	
	public Ambiente pegarSaida(String saida){
		return saidas.get(saida);
	}
	
	public void pegarTodasAsSaidas(){
		for (int i = 0; i < saidas.size(); i++) {
			System.out.print("| " + saidas.keySet().toArray()[i] + " |");
		}
		System.out.print("\n");
	}
	
	public void adicionarObjetos( Objeto objeto ){
		objetos.add( objeto );
	}
	
	public void removerObjetos( Objeto objeto ) {
		objetos.remove(objeto);
	}
	
	public void adicionarNpc( Npc npc){
		npcs.add(npc);
	}
	
	public void removerNpc( Npc npc ) {
		npcs.add(npc);
	}
	
	public Objeto pegarObjeto(String objetoNome){
		for(Objeto objeto: objetos){
			if(objeto.pegarNome().equalsIgnoreCase(objetoNome)){
				return objeto;
			}
		}
		return null;
	}
	public Objeto removerEpegarObjeto(String objetoNome){
		for(Objeto objeto: objetos){
			if(objeto.pegarNome().equalsIgnoreCase(objetoNome) && objeto.isRecolhivel()){
				removerObjetos(objeto);
				return objeto;
			}
		}
		return null;
	}
	
	
	public void exibirTudoDaSala(){
		
		System.out.println("|  --------------------------------------------------------------------------  |");
		System.out.println("Você entrou na Sala: " + pegarNome());
		System.out.println(pegarDescricao());
		System.out.println("|  --------------------------------------------------------------------------  |");
		if ( !npcs.isEmpty() ) { 
			System.out.println("Os seguintes npc estão nesse ambiente: ");
			for( Npc npc : npcs ) {
				if ( npc.pegarDescricao() != null)
					System.out.println( npc.pegarNome() + " - "+ npc.pegarDescricao());
				else 
					System.out.println( npc.pegarNome() );
			}
			
		}
		if( !objetos.isEmpty()) {
			System.out.println("Os seguinte objetos estão nesse ambiente: ");
			for( Objeto objeto : objetos ) {
				if ( objeto.pegarDescricao() != null )
					System.out.println(objeto.pegarNome() + " - " + objeto.pegarDescricao());
				else 
					System.out.println(objeto.pegarNome());
			}
			System.out.println("|  --------------------------------------------------------------------------  |");
			
		}
		//System.out.println("|  --------------------------------------------------------------------------  |");
		System.out.println(" As saidas desse ambiente é são: ");
		this.pegarTodasAsSaidas();
		System.out.println("|  --------------------------------------------------------------------------  |");

	}

	public void procuraNpcsComEvento(Jogador jogador){
		for (Npc npc : npcs) {
			String saida = npc.eventoInicio(jogador);
			if ( saida != null ) {
				System.out.println(saida);
			}
				
		}

	}
	
	public String falarComNpc(Jogador jogador, String nome, String mensagem) {
		String mensagemNpc = "";
		for( Npc npc : npcs ) {
			if ( npc.pegarNome().equalsIgnoreCase(nome) ) {
				mensagemNpc = npc.falar(jogador,mensagem);

			}
		}
		return mensagemNpc;
		
	}
	
	public Npc pegarNpc(String npcNome){
		System.out.println( npcNome );
		for (Npc npc : npcs) {
			if ( npc.pegarNome().equalsIgnoreCase(npcNome)) {
				return npc;
			}
		}
		return null;
	}
	
	
	
}
